package com.somewater.game.controllers
{
	import com.somewater.control.IClear;
	import com.somewater.game.GameModule;
	import com.somewater.game.display.Cup;
	
	import flash.display.Sprite;
	import flash.events.EventDispatcher;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	
	/**
	 * Синглтон, обеспечивающий логику итераций
	 */
	public class SpatialController extends EventDispatcher implements IClear
	{
		public static var instance:SpatialController;
		
		public var entities:Array;
		public var entitieById:Array;
		
		public var entityLayerRef:Sprite;
		
		public var leftCupRef:Rectangle;
		public var rightCupRef:Rectangle;
		public var leftCupVelocityY:Number = 0.01;
		public var rightCupVelocityY:Number = 0;
		public var lavaRef:Point;//  на самом деле учитывается только Y координата
		
		
		public function SpatialController(w:Number, h:Number)
		{
			super();
			
			if(instance)
				throw new Error("Hm?! I`m already created!");
			
			instance = this;
			
			leftCupRef = new Rectangle(-350, 200, Cup.CUP_WIDTH, 45);
			rightCupRef = new Rectangle(50, 200, Cup.CUP_WIDTH, 45);
			lavaRef = new Point(0, 0);
			
			// TODO: откудато взять их
			entitieById = [];
			entities = [];
			
			allocateEntity({"id":1, "x":3, "y": 56});
		}
		
		
		public function clear():void
		{
			for(var i:int = 0;i<entities.length;i++)
			{
				Entity(entities[i]).clear();
			}
			
			instance = null;
			entityLayerRef = null;
			leftCupRef = null;
			rightCupRef = null;
			lavaRef = null;
			entitieById = null;
			entities = null;
		}
		
		
		public function onTick(deltaTime:Number):void
		{
			var max:int = entities.length;
			var i:int;
			var entity:Entity;
			
			// сначала обновить позиции
			for(i = 0;i<max;i++)
			{
				entity = entities[i];
				entity.spatial.onTick(deltaTime);
			}
			
			// потом обновить внешнее представление
			for(i = 0;i<max;i++)
			{
				entity = entities[i];
				entity.render.onTick(deltaTime);
			}
			
			// скорости платформ
			leftCupRef.y += leftCupVelocityY;
			rightCupRef.y += rightCupVelocityY;
		}
		
		
		
		public function allocateEntity(data:*):Entity
		{
			var id:String;
			
			if(data is String)
				id = data;
			
			if(data && data.hasOwnProperty("id"))
				id = data.id;
			
			if(data && data.hasOwnProperty("user_id"))
				id = data.user_id;
			
			if(id == null) return null;
			
			// проверить, не создан ли уже такой обхект
			if(entitieById[id])
				return entitieById[id];
				
			var e:Entity = new Entity();
			entities.push(e);
			entitieById[id] = e;
			return e;
		}
		
		
		public function removeEntityById(id:String):Entity
		{
			var e:Entity = entitieById[id];
			if(e)
				e.clear();
			return e;
		}
		
		
	}
}